/* 
 * File:   StyleSheet.h
 * Author: H4314
 *
 * Created on 24 avril 2012, 08:13
 */

#ifndef STYLESHEET_H
#define	STYLESHEET_H

#include <map>
#include <iostream>
#include <sstream>
#include <iomanip>

#include "Template.h"
#include "../xml/Element.h"
#include "../xml/Content.h"

// Noeud template
#define TEMPLATE    "template"

using namespace std;

class StyleSheet {
public:
    // Construit une feuille de style à partir du noeud xsl rootSheet
    StyleSheet(Element * rootSheet);
    virtual ~StyleSheet();
    
    // Ajoute proprement un template à la map
    void addTemplate(Template * templ);
    
    // Applique les transformations au sous-arbre de racine xmlNode (récursif)
    // Retourne l'arbre html nouvellement alloué en mémoire
    list<Node *> Transform(Node * xmlNode);
    
    // Surchage de l'opérateur pour afficher la liste des templates reconnus
    friend ostream & operator<<(ostream & stream, const StyleSheet & ssheet);
    
private:
    map<string, Template *> templates;
    
    // Cherche si un template match le noeud et le retourne, sinon retourne NULL
    Template * findTemplate(Node * xmlNode);
    
    // Charge la liste des templates à partir de la racine xslNode
    void ConstructTemplate(Node * xslNode);
};

#endif	/* STYLESHEET_H */

